package com.pe.pgn.clubpgn.dao.impl;

import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.dao.PremioCatalogoDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNPremioCatalogo;

@Repository("premioCatalogoDao")
public class PremioCatalogoDaoImpl extends
		GenericDaoHibernate<ClprPremioCatalogo, Long> implements
		PremioCatalogoDao {
	
	@SuppressWarnings("unused")
	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public PremioCatalogoDaoImpl() {
		super(ClprPremioCatalogo.class);
	}

	
	@SuppressWarnings("unchecked")
	public List<BNPremioCatalogo> buscarPremios(String deArticulo,
			String coCodigoPremio, Long coCategoria,Long coCatalogo,
			Long coAlmacen){
		
		StringBuffer query = new StringBuffer();
		
		query.append("select DISTINCT pc.id as id, ");
		query.append(" 	pc.va_canjes_limite_espejo as vaCanjesLimiteEspejo,");
		query.append("	pc.va_canjes_limite as vaCanjesLimite, ");
		query.append("	articulo.de_Articulo as deArticulo , ");
		query.append("	articulo.co_codigo_articulo as coArticulo, ");
		query.append("	pc.co_codigo_premio as coPremio, ");
		query.append("	categoria.de_Categoria as deCategoria, ");
		query.append("	unidad.de_unidad_medida as deUnidadMedida, ");
		query.append("	articulo.va_stock_actual as stockActual, ");
		query.append("	sac.va_cantidad as stockDisponible,");
		query.append(" 	articulo.st_maneja_stock_punto_canje	as stManejaStockPuntoCanje, ");
		query.append(" 	articulo.st_maneja_stock_alm_principal	as stManejaStockAlmPrincipal, ");
		query.append(" 	articulo.st_instantaneo_normal	as stInstantaneoNormal, ");
		query.append(" 	pc.va_stock_catalogo as vaStockCatalogo ");
		
		query.append("from clpr_premio_catalogo pc   " ) ;
		query.append("join clpd_articulo articulo 		on articulo.id = pc.co_premio ");
		query.append("join clpd_unidad_medida unidad 	on articulo.co_unidad_medida = unidad.id "); 
		query.append("join clpb_categoria categoria 	on articulo.co_categoria = categoria.id  ");
		query.append("join clpm_catalogo catalogo 		on pc.co_catalogo = catalogo.id ");
		query.append("join clpm_stock_almacen_catalogo sac on articulo.id = sac.co_articulo ");  		
		query.append("where  pc.st_premio_catalogo='Y' and 1 = 1   " ) ; 		
		
		
		if (StringUtils.isNotBlank(deArticulo)) {
			query.append("		and upper(trim(articulo.de_articulo)) like '%").append(
					deArticulo.trim().toUpperCase()).append("%'");
		}
				
		if (StringUtils.isNotBlank(coCodigoPremio)) {
			query.append("		and upper(trim(pc.co_codigo_premio)) like '%").append(
					coCodigoPremio.trim().toUpperCase()).append("%'");
		}
		
		if(coCategoria.intValue() > 0){
			query.append("		and articulo.co_categoria = ").append(coCategoria);
		}

		if(coAlmacen.intValue() > 0){
			query.append("		and sac.co_almacen = ").append(coAlmacen);
		}
		
		query.append("	and pc.co_catalogo = ").append(coCatalogo);
		query.append("	and sac.co_catalogo is null   " ) ;
		query.append("	and (");
		query.append("	   articulo.st_maneja_stock_punto_canje   = 'Y'  or " );		
		query.append("	   articulo.st_maneja_stock_alm_principal = 'Y'  or articulo.st_instantaneo_normal='Y'   " );
		query.append("		)");
		
		System.out.println("*** PremioCatalogoDaoImpl.buscarPremios() -MODIFICADO-> "+query.toString());
		return findListOfBeans(query.toString(), null, BNPremioCatalogo.class);
	}
	
	public void eliminarPremio(Long id) {
		ClprPremioCatalogo premio = getHibernateTemplate().get(ClprPremioCatalogo.class, id);
		premio.setStPremioCatalogo(Boolean.FALSE);
		getHibernateTemplate().update(premio);

	}
	
	public void guardarPremio(ClprPremioCatalogo premio) {

		if (premio.getId() == null) {
			premio.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			premio.setDaFechaCreacion(Calendar.getInstance());
		} else {
			premio.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			premio.setDaFechaModificacion(Calendar.getInstance());
		}

		getHibernateTemplate().saveOrUpdate(premio);
		getHibernateTemplate().flush();
	}

	
	public ClprPremioCatalogo obtenerPremio(Long id) {
		Criteria criteria = DetachedCriteria.forClass(ClprPremioCatalogo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.add(Restrictions.eq("id", id).ignoreCase());
		ClprPremioCatalogo premio= (ClprPremioCatalogo)criteria.uniqueResult();
		return premio;
	}

	
	@SuppressWarnings("unchecked")
	public BNPremioCatalogo obtenerPremio(String coCodigoPremio) {
  		StringBuffer query = new StringBuffer();
		query.append("select " ) ;  
		query.append("pc.id as id,  ");
		query.append("pc.va_canjes_limite_espejo as vaCanjesLimiteEspejo,  ");
		query.append("pc.va_canjes_limite as vaCanjesLimite,  ");
		query.append("articulo.de_Articulo 	 as deArticulo  , ");
		query.append("articulo.co_codigo_articulo 	 as coArticulo  , ");
		query.append("pc.co_codigo_premio 		 as coPremio  , ");
		query.append("categoria.de_Categoria 		 as deCategoria  , ");
		query.append("unidad.de_unidad_medida 	 as deUnidadMedida, "); 
		query.append("articulo.va_stock_actual 		as stockActual, ");
		query.append("articulo.va_stock_disponible 	as stockDisponible ");
        query.append("from clpr_premio_catalogo pc  ");
		query.append("join clpd_articulo articulo ");  		
		query.append("		on pc.co_premio = articulo.id ");
		
		query.append("join clpd_unidad_medida unidad ");
		query.append("		on articulo.co_unidad_medida = unidad.id ");
		
		query.append("join clpb_categoria categoria ");
		query.append("		on articulo.co_categoria = categoria.id ");  
		
        query.append("where 1 = 1");        
        query.append("		and pc.co_codigo_premio = ").append(coCodigoPremio);
        
        List<BNPremioCatalogo> listaPremio = findListOfBeans(query.toString(), null, BNPremioCatalogo.class);
        
		if(!listaPremio.isEmpty()){
			return listaPremio.get(0);
		}
		return null;		
	}
	
	
	@SuppressWarnings("unchecked")
	public List<BNPremioCatalogo> obtenerPremios(Long coCatalogo) {
		  		StringBuffer query = new StringBuffer();
				query.append("select " ) ;  
				query.append("pc.id as id,  ");
				query.append("pc.va_canjes_limite as vaCanjesLimite,  ");
				query.append("articulo.de_Articulo 	 as deArticulo  , ");
				query.append("articulo.co_codigo_articulo 	 as coArticulo  , ");
				query.append("pc.co_codigo_premio 		 as coPremio  , ");
				query.append("categoria.de_Categoria 		 as deCategoria  , ");
				query.append("unidad.de_unidad_medida 	 as deUnidadMedida, "); 
				query.append("articulo.va_stock_actual 		as stockActual, ");
				query.append("articulo.va_stock_disponible 	as stockDisponible ");
		        query.append("from clpr_premio_catalogo pc  ");
				query.append("join clpd_articulo articulo ");  		
				query.append("		on pc.co_premio = articulo.id ");
				
				query.append("join clpd_unidad_medida unidad ");
				query.append("		on articulo.co_unidad_medida = unidad.id ");
				
				query.append("join clpb_categoria categoria ");
				query.append("		on articulo.co_categoria = categoria.id ");  
				
		        query.append("where 1 = 1");
				

		        query.append("		and pc.co_catalogo = ").append(coCatalogo);
				
				System.out.println("*** remioCatalogoDaoImpl.obtenerPremios() --> "+query.toString());
				return findListOfBeans(query.toString(), null, BNPremioCatalogo.class);

	}
}
